﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.IO;

namespace MVCScaffold
{
    public class GerenciadorArquivoProjeto
    {
        public GerenciadorArquivoProjeto(string caminhoArquivoProjeto)
        {
            XElement xml = XElement.Load(caminhoArquivoProjeto, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);

            this.RecuperarRootNamespace(xml);
            this.RecuperarNomeArquivoEDMX(xml);
            this.ProcurarControllers(xml);
            this.ProcurarViews(xml);
            this.DiretorioProjeto = Path.GetDirectoryName(caminhoArquivoProjeto);
            this.NomeArquivoProjeto = Path.GetFileName(caminhoArquivoProjeto);
        } 

        public string Namespace { get; private set; }
        public string NomeArquivoEDMX { get; private set; }
        public bool ExisteController { get; private set; }
        public bool ExisteViews { get; private set; }
        public string DiretorioProjeto { get; private set; }
        public string NomeArquivoProjeto { get; set; }
       
        private void RecuperarRootNamespace(XElement xml)
        {
            var elementos = xml.Elements();
            var elementosPropertyGroup = elementos.Where(x => x.Name.LocalName == "PropertyGroup");
            foreach (var item in elementosPropertyGroup)
            {
                if (item.Elements().Count(x => x.Name.LocalName == "RootNamespace") > 0)
                    this.Namespace = item.Elements().FirstOrDefault(x => x.Name.LocalName == "RootNamespace").Value;
            }
        }

        private void RecuperarNomeArquivoEDMX(XElement xml)
        {
            var elementos = xml.Elements();
            var elementosPropertyGroup = elementos.Where(x => x.Name.LocalName == "ItemGroup");
            foreach (var item in elementosPropertyGroup)
            {
                if (item.Elements().Count(x => x.Name.LocalName == "EntityDeploy") > 0)
                {
                    this.NomeArquivoEDMX = item.Elements().FirstOrDefault(x => x.Name.LocalName == "EntityDeploy").Attribute("Include").Value;
                    break;
                }
            }
        }

        private void ProcurarControllers(XElement xml)
        {
            var elementos = xml.Elements();
            var elementosPropertyGroup = elementos.Where(x => x.Name.LocalName == "ItemGroup");
            var existeReferenciaController = false;

            foreach (var item in elementosPropertyGroup)
            {
                var elementosCompile = item.Elements().Where(x => x.Name.LocalName == "Compile");
                if (elementosCompile.Count() > 0)
                {
                    existeReferenciaController = elementosCompile
                        .Where(x => x.Attribute("Include").Value.StartsWith("Controllers", StringComparison.CurrentCultureIgnoreCase)).Count() > 0;

                    if (existeReferenciaController)
                    {
                        this.ExisteController = existeReferenciaController;
                        break;
                    }
                }
            }
        }

        private void ProcurarViews(XElement xml)
        {
            var elementos = xml.Elements();
            var elementosPropertyGroup = elementos.Where(x => x.Name.LocalName == "ItemGroup");
            var existeReferenciaPastaViews = false;

            foreach (var item in elementosPropertyGroup)
            {
                var elementosCompile = item.Elements().Where(x => x.Name.LocalName == "Content");
                if (elementosCompile.Count() > 0)
                {
                    existeReferenciaPastaViews = elementosCompile
                        .Where(x => x.Attribute("Include").Value.StartsWith("Views", StringComparison.CurrentCultureIgnoreCase)).Count() > 0;

                    if (existeReferenciaPastaViews)
                        this.ExisteViews = existeReferenciaPastaViews;
                }
            }
        }
    }
}
